#!/bin/bash
stty sane
stty erase ^H

# start1 - 初始设置和MySQL连接验证
# 函数：验证路径是否存在，并检查下级是否有 app 文件夹
validate_path() {
    local path="$1"
    if [ -n "$path" ] && [ -d "$path" ]; then
        if [ -d "$path/app" ]; then
            echo "检测到 $path 文件夹，路径有效。"
            return 0
        else
            echo "错误：目录 $path 下未找到文件夹，请检查路径！"
            return 1
        fi
    else
        echo "错误：目录 $path 不存在，请检查路径！"
        return 1
    fi
}

# 获取当前OA版本
get_current_version() {
    local index_file="$1/public/index.php"
    if [ -f "$index_file" ]; then
        local version=$(grep "define('CMS_VERSION'" "$index_file" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
        echo "$version"
    else
        echo "0.0.0"
    fi
}

# 从SQL文件名提取版本号
extract_version_from_filename() {
    local filename="$1"
    local version=$(echo "$filename" | grep -oE "[0-9]+\.[0-9]+(\.[0-9]+)?")
    echo "$version"
}

# 版本比较函数
version_compare() {
    local ver1=$(echo "$1" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    local ver2=$(echo "$2" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    local v1=($(echo "$ver1" | tr '.' ' '))
    local v2=($(echo "$ver2" | tr '.' ' '))
    
    for ((i=0; i<3; i++)); do
        if [ -z "${v1[i]}" ]; then v1[i]=0; fi
        if [ -z "${v2[i]}" ]; then v2[i]=0; fi
        
        if [ "${v1[i]}" -gt "${v2[i]}" ]; then
            echo "greater"
            return
        elif [ "${v1[i]}" -lt "${v2[i]}" ]; then
            echo "less"
            return
        fi
    done
    
    echo "equal"
}

# 计算MD5校验和
calculate_md5() {
    md5sum "$1" | awk '{print $1}'
}

# 自动标记已升级版本为SUCCESS
mark_previous_versions_as_success() {
    local current_version="$1"
    local updatesql="$2"
    local sql_status_file="$3"
    
    # 标准化当前版本为三位格式
    local std_current_version=$(echo "$current_version" | awk -F. '{ 
        for(i=1;i<=3;i++) { 
            if($i=="") $i=0 
        } 
        printf "%d.%d.%d", $1, $2, $3 
    }')
    
    echo "检测到当前版本为 $current_version (标准化: $std_current_version)，自动标记较低版本的升级脚本为成功状态..."
    
    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            local file_name=$(basename "$sql_file")
            local file_version=$(extract_version_from_filename "$file_name")
            # 标准化文件版本为三位格式
            local std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            local comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "less" ] || [ "$comparison" = "equal" ]; then
                local md5_checksum=$(calculate_md5 "$sql_file")
                # 检查是否已经记录过
                if ! grep -q "^${file_name}|" "$sql_status_file"; then
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|auto-marked" >> "$sql_status_file"
                    echo "自动标记: $file_name (版本 $file_version) 为已成功状态"
                fi
            fi
        fi
    done
}

# 提示用户输入 MySQL 连接信息
while true; do
    read -p "请输入 MySQL 用户名一般用root(默认root): " MYSQL_USER
    MYSQL_USER=${MYSQL_USER:-root}
    
    # 密码需要输入两次确认
    while true; do
        read -s -p "请输入 MySQL 密码一般用root密码（必填）: " MYSQL_PASSWORD1
        echo
        read -s -p "请再次输入 MySQL 密码确认: " MYSQL_PASSWORD2
        echo
        
        if [ -z "$MYSQL_PASSWORD1" ]; then
            echo "错误：密码不能为空，请重新输入！"
        elif [ "$MYSQL_PASSWORD1" != "$MYSQL_PASSWORD2" ]; then
            echo "错误：两次输入的密码不一致，请重新输入！"
        else
            MYSQL_PASSWORD="$MYSQL_PASSWORD1"
            break
        fi
    done
    
    read -p "请输入 MySQL 主机地址 (默认: 127.0.0.1)回车: " MYSQL_HOST
    MYSQL_HOST=${MYSQL_HOST:-127.0.0.1}
    read -p "请输入 MySQL 端口 (默认: 3306)回车: " MYSQL_PORT
    MYSQL_PORT=${MYSQL_PORT:-3306}

    # 测试 MySQL 连接
    if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1;" > /dev/null 2>&1; then
        echo " "
        echo " "
        echo "  MySQL 连接成功！"
        echo "##################"
        echo " "
        break
    else
        echo "错误：无法连接到 MySQL 服务器，请检查服务状态或配置！"
        read -p "是否重新输入 MySQL 连接信息？(y/n): " RETRY
        if [[ "$RETRY" != "y" && "$RETRY" != "Y" ]]; then
            echo "退出脚本。"
            exit 1
        fi
    fi
done

# 定义备份目录
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other
mkdir -p $bak_pathg $bak_pathu $bak_pathb $bak_patho

# 清理旧备份和临时文件
rm -rf /data/{office,blog,dev} $bak_pathu/{office,blog,dev}.tar.gz $bak_pathg/{gouguoa,gougublog,gougudev}.sql.gz
find $bak_pathu -maxdepth 1 -type f -exec rm -f {} \;
find $bak_pathg -maxdepth 1 -type f -exec rm -f {} \;
# end1

# start2 - OA系统升级
# 升级 OA 应用
while true; do
    read -p "请输入 OA 应用的根目录路径（例如 /www/wwwroot/office 如果未安装请留空）: " OA_ROOT
    if [ -z "$OA_ROOT" ]; then
        echo "未提供 OA 应用路径，跳过 OA 升级。"
        break
    fi
    if validate_path "$OA_ROOT"; then
        break
    else
        while true; do
            read -p "是否重新输入 OA 应用路径？(y/n): " RETRY
            case "$RETRY" in
                [yY])
                    break
                    ;;
                [nN])
                    echo "跳过 OA 数据库备份。"
                    OA_DB_NAME=""
                    exit 1
                    ;;
                *)
                    echo "输入无效！请输入 y/Y 或 n/N"
                    continue
                    ;;
            esac
        done
    fi
done

if [ -n "$OA_ROOT" ]; then
    echo "开始升级 OA 应用..."

    # 获取当前版本
    CURRENT_VERSION=$(get_current_version "$OA_ROOT")
    echo "当前OA系统版本: $CURRENT_VERSION"

    # 如果版本获取失败，设置默认版本
    if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
        echo "警告：无法获取当前版本，假设为初始版本 5.1.7"
        CURRENT_VERSION="5.1.7"
    fi

    # 输入 OA 数据库名称
    while true; do
        read -p "请输入 OA 应用的数据库名称(默认：gouguoa): " OA_DB_NAME
        OA_DB_NAME=${OA_DB_NAME:-gouguoa}
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $OA_DB_NAME;" > /dev/null 2>&1; then
            break
        else
            echo "错误：数据库 $OA_DB_NAME 不存在，请检查名称！"
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
            while true; do
                read -p "是否重新输入 OA 数据库名称？(y/n): " RETRY
                RETRY=$(echo "$RETRY" | tr '[:upper:]' '[:lower:]')
                
                if [[ "$RETRY" == "y" ]]; then
                    break
                elif [[ "$RETRY" == "n" ]]; then
                    echo "退出程序。"
                    exit 1
                else
                    echo "错误：输入无效，必须输入 y/Y 或 n/N！"
                fi
            done
        fi
    done

    # 创建SQL执行状态文件
    OA_SQL_STATUS_FILE="/opt/updatemysqllog/oa_upgrade_status.log"
    mkdir -p "/opt/updatemysqllog"
    touch "$OA_SQL_STATUS_FILE"

    # 处理记录
    cp -f /opt/updatemysqllog/oa_upgrade_status.log /opt/updatemysqllog/oa_upgrade_status.log.bak

    # 备份 OA 数据库
    if [ -n "$OA_DB_NAME" ]; then
        echo "备份 OA 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME" | gzip > "$bak_pathg/gouguoa.sql.gz"
        if [ $? -eq 0 ]; then
            echo "OA 数据库备份成功！"
        else
            echo "错误：OA 数据库备份失败！"
            exit 1
        fi
    fi

    # 备份 OA 应用文件
    echo "备份 OA 应用文件..."
    tar -czf "$bak_pathg/office.tar.gz" -C "$(dirname "$OA_ROOT")" "$(basename "$OA_ROOT")"
    if [ $? -eq 0 ]; then
        echo "OA 应用文件备份成功！"
    else
        echo "错误：OA 应用文件备份失败！"
        exit 1
    fi

    # 克隆最新的 OA 代码
    echo "克隆最新的 OA 代码..."
    cd /data
    git clone https://gitee.com/gouguopen/office.git || { echo "克隆不成功，请从新运行"; exit 1; }
    if [ $? -eq 0 ]; then
        echo "OA 代码克隆成功！"
    else
        echo "错误：OA 代码克隆失败！"
        exit 1
    fi

    # 备份并恢复用户上传文件
    echo "备份并恢复文件..."
    mkdir -p /data/storage_backup

    # 备份用户上传的文件（storage/app/public目录）
    if [ -d "$OA_ROOT/public/storage" ]; then
        cp -rf "$OA_ROOT/public/storage"/* /data/storage_backup/ 2>/dev/null || true
        echo "已备份文件"
    else
        echo "未找到目录，跳过备份"
    fi

    # 备份 config/database.php 文件
    echo "备份文件..."
    cp -f "$OA_ROOT/config/database.php" /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "文件备份成功！"
    else
        echo "错误：文件备份失败！"
        exit 1
    fi

    # 使用 cp -fru 更新整个目录
    echo "更新 OA 应用文件..."
    cp -fru /data/office/* "$OA_ROOT/"
    if [ $? -eq 0 ]; then
        echo "OA 应用文件更新成功！"
    else
        echo "错误：OA 应用文件更新失败！"
        exit 1
    fi

    # 还原 config/database.php 文件
    echo "还原文件..."
    cp -f /data/database.php.backup "$OA_ROOT/config/database.php"
    if [ $? -eq 0 ]; then
        echo "文件还原成功！"
    else
        echo "错误：文件还原失败！"
        exit 1
    fi

    # 恢复用户上传的文件
    echo "恢复文件..."
    if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
        cp -rf /data/storage_backup/* "$OA_ROOT/public/storage"/ 2>/dev/null || true
        echo "用户恢复完成"
    else
        echo "无文件需要恢复"
    fi

    # 删除临时备份目录
    echo "清理临时文件..."
    rm -rf /data/storage_backup /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "临时文件清理成功！"
    else
        echo "错误：临时文件清理失败！"
        exit 1
    fi

    echo "#####################################"
    echo "开始处理数据库升级..."

    # 处理升级文件（例如 SQL 脚本）
    updatesql=/data/updatesql
    rm -rf $updatesql
    mkdir -p $updatesql

    # 下载所有SQL升级文件
    echo "正在下载升级文件..."
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate001_5.1.8.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate002_5.5.0.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate003_5.6.0.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate004_5.7.6.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate005_5.8.0.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate006_5.9.0.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate007_5.9.2.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate008_5.9.3.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate009_5.9.5.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate010_5.9.6.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate011_5.9.8.sql
    wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/oasql/oaupdate012_5.9.9.sql

    # 为所有SQL文件添加MySQL dump头
    SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gouguoa
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            temp_file="${sql_file}.tmp"
            echo "$SQL_HEADER" > "$temp_file"
            cat "$sql_file" >> "$temp_file"
            mv "$temp_file" "$sql_file"
            echo "数据库文件: $(basename "$sql_file")"
        fi
    done

    # 自动标记已升级版本为SUCCESS
    mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql" "$OA_SQL_STATUS_FILE"

    # 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
    UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

    echo "开始执行升级脚本..."
    while IFS= read -r UPGRADE_FILE; do
        if [ -f "$UPGRADE_FILE" ]; then
            file_name=$(basename "$UPGRADE_FILE")
            file_version=$(extract_version_from_filename "$file_name")
            # 标准化版本进行比较
            std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "greater" ]; then
                echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
                
                md5_checksum=$(calculate_md5 "$UPGRADE_FILE")
                
                # 检查是否已成功执行过相同文件
                if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$OA_SQL_STATUS_FILE"; then
                    echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
                    continue
                fi
                
                # 记录开始执行
                echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$OA_SQL_STATUS_FILE"
                
                echo "========== 开始执行SQL文件: $file_name =========="
                if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME" < "$UPGRADE_FILE" 2> /tmp/sql_error.log; then
                    # 执行成功
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$OA_SQL_STATUS_FILE"
                    echo "========== SQL执行成功 =========="
                else
                    # 执行失败
                    error_msg=$(cat /tmp/sql_error.log | tr '\n' ' ' | head -c 200)  # 截取前200个字符防止过长
                    echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$OA_SQL_STATUS_FILE"
                    echo "========== SQL执行失败 =========="
                    echo "错误信息: $error_msg"
                    
                    # 执行回滚操作
                    echo "检测到SQL执行失败，开始回滚OA系统..."
                    
                    # 恢复数据库
                    if [ -f "$bak_pathg/gouguoa.sql.gz" ]; then
                        # 先删除现有数据库
                        echo "删除现有数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $OA_DB_NAME;"
        
                        # 重新创建空数据库
                        echo "重新创建空数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $OA_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"                    
                        echo "恢复OA数据库..."
                        zcat "$bak_pathg/gouguoa.sql.gz" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME"
                    fi
                    
                    # 恢复文件系统
                    if [ -f "$bak_pathg/office.tar.gz" ]; then
                        echo "恢复OA文件系统..."
                        rm -rf "$OA_ROOT"/*
                        tar -xzf "$bak_pathg/office.tar.gz" -C "$(dirname "$OA_ROOT")"
                    fi
                    
                    echo "OA系统回滚完成，已恢复到升级前状态"
                    echo " "
                    echo "1、请处理上面提示问题后重新升级。"
                    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
                    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/oa_upgrade_status.log"
                    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/oa_upgrade_status.log"
                    echo " "
                    exit 1
                fi
            else
                echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
            fi
        else
            echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
        fi
    done <<< "$UPGRADE_FILES"

    # 删除下载的数据库文件
    sleep 2
    rm -rf $updatesql
    echo "#####################################"

    # 设置目录权限
    echo "设置目录权限..."
    chmod -R 777 "$OA_ROOT"/{app,public,config,runtime}
    if [ $? -eq 0 ]; then
        echo "目录权限设置成功！"
    else
        echo "错误：目录权限设置失败！"
        exit 1
    fi

    # 清理临时目录
    echo "清理临时目录..."
    rm -rf "$OA_ROOT"/app/install
    rm -rf /data/office
    if [ $? -eq 0 ]; then
        echo "临时目录清理成功！"
    else
        echo "错误：临时目录清理失败！"
        exit 1
    fi

    echo "OA 升级完成！"

    # 更新完成后，备份 OA 应用文件和数据库
    echo "更新完成后，备份 OA 应用文件和数据库..."
    tar -czf "$bak_pathu/office.tar.gz" -C "$(dirname "$OA_ROOT")" "$(basename "$OA_ROOT")"
    if [ $? -eq 0 ]; then
        echo "OA 应用文件备份成功！"
    else
        echo "错误：OA 应用文件备份失败！"
        exit 1
    fi

    if [ -n "$OA_DB_NAME" ]; then
        echo "备份 OA 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME" | gzip > "$bak_pathu/gouguoa.sql.gz"
        if [ $? -eq 0 ]; then
            echo "OA 数据库备份成功！"
        else
            echo "错误：OA 数据库备份失败！"
            exit 1
        fi
    fi
fi
# end2

# start3 - Blog系统升级
# 升级 Blog 应用
while true; do
    read -p "请输入 Blog 应用的根目录路径（例如 /www/wwwroot/blog 如果未安装请留空）: " BLOG_ROOT
    if [ -z "$BLOG_ROOT" ]; then
        echo "未提供 Blog 应用路径，跳过 Blog 升级。"
        break
    fi
    if validate_path "$BLOG_ROOT"; then
        break
    else
        while true; do
            read -p "是否重新输入 BLOG 应用路径？(y/n): " RETRY
            RETRY=$(echo "$RETRY" | tr '[:upper:]' '[:lower:]')
            
            if [[ "$RETRY" == "y" ]]; then
                break
            elif [[ "$RETRY" == "n" ]]; then
                echo "退出程序。"
                exit 1
            else
                echo "错误：输入无效，必须输入 y/Y 或 n/N！"
            fi
        done
    fi
done

if [ -n "$BLOG_ROOT" ]; then
    echo "开始升级 Blog 应用..."

    # 获取当前版本 - 新增版本检测
    CURRENT_VERSION=$(get_current_version "$BLOG_ROOT")
    echo "当前BLOG系统版本: $CURRENT_VERSION"

    # 如果版本获取失败，设置默认版本
    if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
        echo "警告：无法获取当前版本，假设为初始版本 3.6.27"
        CURRENT_VERSION="3.6.27"
    fi

    # 输入 Blog 数据库名称
    while true; do
        read -p "请输入 Blog 应用的数据库名称(默认：gougublog): " BLOG_DB_NAME
        BLOG_DB_NAME=${BLOG_DB_NAME:-gougublog}
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $BLOG_DB_NAME;" > /dev/null 2>&1; then
            break
        else
            echo "错误：数据库 $BLOG_DB_NAME 不存在，请检查名称！"
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
            while true; do
                read -p "是否重新输入 BLOG 数据库名称？(y/n): " RETRY
                RETRY=$(echo "$RETRY" | tr '[:upper:]' '[:lower:]')
                
                if [[ "$RETRY" == "y" ]]; then
                    break
                elif [[ "$RETRY" == "n" ]]; then
                    echo "跳过 BLOG 数据库备份。"
                    exit 1
                else
                    echo "错误：输入无效，必须输入 y/Y 或 n/N！"
                fi
            done
        fi
    done

    # 创建SQL执行状态文件
    BLOG_SQL_STATUS_FILE="/opt/updatemysqllog/blog_upgrade_status.log"
    mkdir -p "/opt/updatemysqllog"
    touch "$BLOG_SQL_STATUS_FILE"

    # 处理记录
    cp -f /opt/updatemysqllog/blog_upgrade_status.log /opt/updatemysqllog/blog_upgrade_status.log.bak

    if [ -n "$BLOG_DB_NAME" ]; then
        # 备份 Blog 数据库
        echo "备份 Blog 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME" | gzip > "$bak_pathg/gougublog.sql.gz"
        if [ $? -eq 0 ]; then
            echo "Blog 数据库备份成功！"
        else
            echo "错误：Blog 数据库备份失败！"
            exit 1
        fi
    fi

    # 备份 Blog 应用文件
    echo "备份 Blog 应用文件..."
    tar -czf "$bak_pathg/blog.tar.gz" -C "$(dirname "$BLOG_ROOT")" "$(basename "$BLOG_ROOT")"
    if [ $? -eq 0 ]; then
        echo "Blog 应用文件备份成功！"
    else
        echo "错误：Blog 应用文件备份失败！"
        exit 1
    fi

    # 克隆最新的 Blog 代码
    echo "克隆最新的 Blog 代码..."
    cd /data
    git clone https://gitee.com/gouguopen/blog.git || { echo "克隆不成功，请从新运行"; exit 1; }
    if [ $? -eq 0 ]; then
        echo "Blog 代码克隆成功！"
    else
        echo "错误：Blog 代码克隆失败！"
        exit 1
    fi

    # 备份 public/storage 目录
    echo "备份并恢复文件..."
    mkdir -p /data/storage_backup

    # 备份用户上传的文件（storage/app/public目录）
    if [ -d "$BLOG_ROOT/public/storage" ]; then
        cp -rf "$BLOG_ROOT/public/storage"/* /data/storage_backup/ 2>/dev/null || true
        echo "已备份文件"
    else
        echo "未找到目录，跳过备份"
    fi


    # 备份 config/database.php 文件
    echo "备份文件..."
    cp -f "$BLOG_ROOT/config/database.php" /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "文件备份成功！"
    else
        echo "错误：文件备份失败！"
        exit 1
    fi

    # 使用 cp -fru 更新整个目录
    echo "更新 Blog 应用文件..."
    cp -fru /data/blog/* "$BLOG_ROOT/"
    if [ $? -eq 0 ]; then
        echo "Blog 应用文件更新成功！"
    else
        echo "错误：Blog 应用文件更新失败！"
        exit 1
    fi

    # 还原 config/database.php 文件
    echo "还原文件..."
    cp -f /data/database.php.backup "$BLOG_ROOT/config/database.php"
    if [ $? -eq 0 ]; then
        echo "文件还原成功！"
    else
        echo "错误：文件还原失败！"
        exit 1
    fi

    # 恢复 public/storage 目录
    echo "恢复文件..."
    if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
        cp -rf /data/storage_backup/* "$BLOG_ROOT/public/storage"/ 2>/dev/null || true
        echo "用户恢复完成"
    else
        echo "无文件需要恢复"
    fi

    # 删除临时备份目录
    echo "清理临时文件..."
    rm -rf /data/storage_backup /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "临时文件清理成功！"
    else
        echo "错误：临时文件清理失败！"
        exit 1
    fi

    echo "清修文件..."
    sed -i '136,157d' "$BLOG_ROOT/app/home/view/index/index.html"
    if [ $? -eq 0 ]; then
        echo "清修成功！"
    else
        echo "清修失败！"
        exit 1
    fi

    echo "#####################################"
    # 处理升级文件（例如 SQL 脚本）
    updatesql=/data/updatesql
    rm -rf $updatesql
    mkdir -p $updatesql

    # 下载所有SQL升级文件
    echo "正在下载升级文件..."
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate000.5.18.sql
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate001_5.1.8.sql
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/blogsql/blogupdate002_5.5.0.sql

    # 为所有SQL文件添加MySQL dump头
    SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gougublog
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            temp_file="${sql_file}.tmp"
            echo "$SQL_HEADER" > "$temp_file"
            cat "$sql_file" >> "$temp_file"
            mv "$temp_file" "$sql_file"
            echo "数据库文件: $(basename "$sql_file")"
        fi
    done

    # 自动标记已升级版本为SUCCESS - 新增版本标记
    mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql" "$BLOG_SQL_STATUS_FILE"

    # 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
    UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

    echo "开始执行BLOG升级脚本..."
    while IFS= read -r UPGRADE_FILE; do
        if [ -f "$UPGRADE_FILE" ]; then
            file_name=$(basename "$UPGRADE_FILE")
            file_version=$(extract_version_from_filename "$file_name")
            # 标准化版本进行比较
            std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "greater" ]; then
                echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
                
                md5_checksum=$(calculate_md5 "$UPGRADE_FILE")
                
                # 检查是否已成功执行过相同文件
                if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$BLOG_SQL_STATUS_FILE"; then
                    echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
                    continue
                fi
                
                # 记录开始执行
                echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$BLOG_SQL_STATUS_FILE"
                
                echo "========== 开始执行SQL文件: $file_name =========="
                if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME" < "$UPGRADE_FILE" 2> /tmp/sql_error.log; then
                    # 执行成功
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$BLOG_SQL_STATUS_FILE"
                    echo "========== SQL执行成功 =========="
                else
                    # 执行失败
                    error_msg=$(cat /tmp/sql_error.log | tr '\n' ' ' | head -c 200)  # 截取前200个字符防止过长
                    echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$BLOG_SQL_STATUS_FILE"
                    echo "========== SQL执行失败 =========="
                    echo "错误信息: $error_msg"
                    
                    # 执行回滚操作
                    echo "检测到SQL执行失败，开始回滚Blog系统..."
                    
                    # 恢复数据库
                    if [ -f "$bak_pathg/gougublog.sql.gz" ]; then
                        # 先删除现有数据库
                        echo "删除现有数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $BLOG_DB_NAME;"
        
                        # 重新创建空数据库
                        echo "重新创建空数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $BLOG_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 
                        echo "恢复Blog数据库..."
                        zcat "$bak_pathg/gougublog.sql.gz" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME"
                    fi
                    
                    # 恢复文件系统
                    if [ -f "$bak_pathg/blog.tar.gz" ]; then
                        echo "恢复Blog文件系统..."
                        rm -rf "$BLOG_ROOT"/*
                        tar -xzf "$bak_pathg/blog.tar.gz" -C "$(dirname "$BLOG_ROOT")"
                    fi
                    
                    echo "Blog系统回滚完成，已恢复到升级前状态"
                    echo " "
                    echo "1、请处理上面提示问题后重新升级。"
                    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
                    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/blog_upgrade_status.log"
                    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/blog_upgrade_status.log"
                    echo " "
                    exit 1
                fi
            else
                echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
            fi
        else
            echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
        fi
    done <<< "$UPGRADE_FILES"

    # 删除下载的数据库文件
    sleep 2
    rm -rf $updatesql
    echo "#####################################"

    # 设置目录权限
    echo "设置目录权限..."
    chmod -R 777 "$BLOG_ROOT"/{app,public,config,runtime}
    if [ $? -eq 0 ]; then
        echo "目录权限设置成功！"
    else
        echo "错误：目录权限设置失败！"
        exit 1
    fi

    # 清理临时目录
    echo "清理临时目录..."
    rm -rf "$BLOG_ROOT"/app/install
    rm -rf /data/blog
    if [ $? -eq 0 ]; then
        echo "临时目录清理成功！"
    else
        echo "错误：临时目录清理失败！"
        exit 1
    fi

    echo "Blog 升级完成！"

    # 更新完成后，备份 Blog 应用文件和数据库
    echo "更新完成后，备份 Blog 应用文件和数据库..."
    tar -czf "$bak_pathu/blog.tar.gz" -C "$(dirname "$BLOG_ROOT")" "$(basename "$BLOG_ROOT")"
    if [ $? -eq 0 ]; then
        echo "Blog 应用文件备份成功！"
    else
        echo "错误：Blog 应用文件备份失败！"
        exit 1
    fi

    if [ -n "$BLOG_DB_NAME" ]; then
        echo "备份 Blog 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME" | gzip > "$bak_pathu/gougublog.sql.gz"
        if [ $? -eq 0 ]; then
            echo "Blog 数据库备份成功！"
        else
            echo "错误：Blog 数据库备份失败！"
            exit 1
        fi
    fi
fi
# end3

# start4 - Dev系统升级
# 升级 Dev 应用
while true; do
    read -p "请输入 Dev 应用的根目录路径（例如 /www/wwwroot/dev 如果未安装请留空）: " DEV_ROOT
    if [ -z "$DEV_ROOT" ]; then
        echo "未提供 Dev 应用路径，跳过 Dev 升级。"
        break
    fi
    if validate_path "$DEV_ROOT"; then
        break
    else
        while true; do
            read -p "是否重新输入 DEV 应用路径？(y/n): " RETRY
            RETRY=$(echo "$RETRY" | tr '[:upper:]' '[:lower:]')
            
            if [[ "$RETRY" == "y" ]]; then
                break
            elif [[ "$RETRY" == "n" ]]; then
                echo "退出程序。"
                exit 1
            else
                echo "错误：输入无效，必须输入 y/Y 或 n/N！"
            fi
        done
    fi
done

if [ -n "$DEV_ROOT" ]; then
    echo "开始升级 Dev 应用..."

    # 获取当前版本 - 新增版本检测
    CURRENT_VERSION=$(get_current_version "$DEV_ROOT")
    echo "当前DEV系统版本: $CURRENT_VERSION"

    # 如果版本获取失败，设置默认版本
    if [ -z "$CURRENT_VERSION" ] || [ "$CURRENT_VERSION" = "0.0.0" ]; then
        echo "警告：无法获取当前版本，假设为初始版本 3.13.15"
        CURRENT_VERSION="3.13.15"
    fi

    # 输入 Dev 数据库名称
    while true; do
        read -p "请输入 Dev 应用的数据库名称(默认：gougudev): " DEV_DB_NAME
        DEV_DB_NAME=${DEV_DB_NAME:-gougudev}
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $DEV_DB_NAME;" > /dev/null 2>&1; then
            break
        else
            echo "错误：数据库 $DEV_DB_NAME 不存在，请检查名称！"
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
            while true; do
                read -p "是否重新输入 DEV 数据库名称？(y/n): " RETRY
                RETRY=$(echo "$RETRY" | tr '[:upper:]' '[:lower:]')
                
                if [[ "$RETRY" == "y" ]]; then
                    break
                elif [[ "$RETRY" == "n" ]]; then
                    echo "跳过 DEV 数据库备份。"
                    exit 1
                else
                    echo "错误：输入无效，必须输入 y/Y 或 n/N！"
                fi
            done
        fi
    done

    # 创建SQL执行状态文件
    DEV_SQL_STATUS_FILE="/opt/updatemysqllog/dev_upgrade_status.log"
    mkdir -p "/opt/updatemysqllog"
    touch "$DEV_SQL_STATUS_FILE"

    # 处理记录
    cp -f /opt/updatemysqllog/dev_upgrade_status.log /opt/updatemysqllog/dev_upgrade_status.log.bak

    if [ -n "$DEV_DB_NAME" ]; then
        # 备份 Dev 数据库
        echo "备份 Dev 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME" | gzip > "$bak_pathg/gougudev.sql.gz"
        if [ $? -eq 0 ]; then
            echo "Dev 数据库备份成功！"
        else
            echo "错误：Dev 数据库备份失败！"
            exit 1
        fi
    fi

    # 备份 Dev 应用文件
    echo "备份 Dev 应用文件..."
    tar -czf "$bak_pathg/dev.tar.gz" -C "$(dirname "$DEV_ROOT")" "$(basename "$DEV_ROOT")"
    if [ $? -eq 0 ]; then
        echo "Dev 应用文件备份成功！"
    else
        echo "错误：Dev 应用文件备份失败！"
        exit 1
    fi

    # 克隆最新的 Dev 代码
    echo "克隆最新的 Dev 代码..."
    cd /data
    git clone https://gitee.com/gouguopen/dev.git || { echo "克隆不成功，请从新运行"; exit 1; }
    if [ $? -eq 0 ]; then
        echo "Dev 代码克隆成功！"
    else
        echo "错误：Dev 代码克隆失败！"
        exit 1
    fi

    # 备份 public/storage 目录
    echo "备份并恢复文件..."
    mkdir -p /data/storage_backup

    # 备份用户上传的文件（storage/app/public目录）
    if [ -d "$DEV_ROOT/public/storage" ]; then
        cp -rf "$DEV_ROOT/public/storage"/* /data/storage_backup/ 2>/dev/null || true
        echo "已备份文件"
    else
        echo "未找到目录，跳过备份"
    fi


    # 备份 config/database.php 文件
    echo "备份文件..."
    cp -f "$DEV_ROOT/config/database.php" /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "文件备份成功！"
    else
        echo "错误：文件备份失败！"
        exit 1
    fi

    # 使用 cp -fru 更新整个目录
    echo "更新 Dev 应用文件..."
    cp -fru /data/dev/* "$DEV_ROOT/"
    if [ $? -eq 0 ]; then
        echo "Dev 应用文件更新成功！"
    else
        echo "错误：Dev 应用文件更新失败！"
        exit 1
    fi

    # 还原 config/database.php 文件
    echo "还原文件..."
    cp -f /data/database.php.backup "$DEV_ROOT/config/database.php"
    if [ $? -eq 0 ]; then
        echo "文件还原成功！"
    else
        echo "错误：文件还原失败！"
        exit 1
    fi

    # 恢复 public/storage 目录
     echo "恢复文件..."
    if [ -d "/data/storage_backup" ] && [ "$(ls -A /data/storage_backup 2>/dev/null)" ]; then
        cp -rf /data/storage_backup/* "$DEV_ROOT/public/storage"/ 2>/dev/null || true
        echo "用户恢复完成"
    else
        echo "无文件需要恢复"
    fi

    # 删除临时备份目录
    echo "清理临时文件..."
    rm -rf /data/storage_backup /data/database.php.backup
    if [ $? -eq 0 ]; then
        echo "临时文件清理成功！"
    else
        echo "错误：临时文件清理失败！"
        exit 1
    fi

    echo "#####################################"
    # 处理升级文件（例如 SQL 脚本）
    updatesql=/data/updatesql
    rm -rf $updatesql
    mkdir -p $updatesql

    # 下载所有SQL升级文件
    echo "正在下载升级文件..."
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate000.5.18.sql
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate001_5.1.8.sql
    #wget -q -P $updatesql https://gitee.com/banban1000/docker/raw/master/oa/devsql/devupdate002_5.5.0.sql

    # 为所有SQL文件添加MySQL dump头
    SQL_HEADER="-- MySQL dump 10.13  Distrib 8.0.36, for Linux (x86_64)
--
-- Host: 127.0.0.1    Database: gougudev
-- ------------------------------------------------------
-- Server version    8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

"

    for sql_file in $updatesql/*.sql; do
        if [ -f "$sql_file" ]; then
            temp_file="${sql_file}.tmp"
            echo "$SQL_HEADER" > "$temp_file"
            cat "$sql_file" >> "$temp_file"
            mv "$temp_file" "$sql_file"
            echo "数据库文件: $(basename "$sql_file")"
        fi
    done

    # 自动标记已升级版本为SUCCESS - 新增版本标记
    mark_previous_versions_as_success "$CURRENT_VERSION" "$updatesql" "$DEV_SQL_STATUS_FILE"

    # 使用find命令获取updatesql目录下所有的.sql文件并按名称排序
    UPGRADE_FILES=$(find "$updatesql" -maxdepth 1 -name "*.sql" | sort)

    echo "开始执行DEV升级脚本..."
    while IFS= read -r UPGRADE_FILE; do
        if [ -f "$UPGRADE_FILE" ]; then
            file_name=$(basename "$UPGRADE_FILE")
            file_version=$(extract_version_from_filename "$file_name")
            # 标准化版本进行比较
            std_file_version=$(echo "$file_version" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            std_current_version=$(echo "$CURRENT_VERSION" | awk -F. '{ 
                for(i=1;i<=3;i++) { 
                    if($i=="") $i=0 
                } 
                printf "%d.%d.%d", $1, $2, $3 
            }')
            
            comparison=$(version_compare "$std_file_version" "$std_current_version")
            
            if [ "$comparison" = "greater" ]; then
                echo "需要执行升级: $file_name (版本 $file_version > 当前版本 $CURRENT_VERSION)"
                
                md5_checksum=$(calculate_md5 "$UPGRADE_FILE")
                
                # 检查是否已成功执行过相同文件
                if grep -q "^${file_name}|SUCCESS|.*|${md5_checksum}" "$DEV_SQL_STATUS_FILE"; then
                    echo "检测到 ${file_name} 已成功执行且未修改，跳过执行"
                    continue
                fi
                
                # 记录开始执行
                echo "${file_name}|STARTED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$DEV_SQL_STATUS_FILE"
                
                echo "========== 开始执行SQL文件: $file_name =========="
                if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME" < "$UPGRADE_FILE" 2> /tmp/sql_error.log; then
                    # 执行成功
                    echo "${file_name}|SUCCESS|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|" >> "$DEV_SQL_STATUS_FILE"
                    echo "========== SQL执行成功 =========="
                else
                    # 执行失败
                    error_msg=$(cat /tmp/sql_error.log | tr '\n' ' ' | head -c 200)  # 截取前200个字符防止过长
                    echo "${file_name}|FAILED|$(date +%Y-%m-%d_%H:%M:%S)|${md5_checksum}|${error_msg}" >> "$DEV_SQL_STATUS_FILE"
                    echo "========== SQL执行失败 =========="
                    echo "错误信息: $error_msg"
                    
                    # 执行回滚操作
                    echo "检测到SQL执行失败，开始回滚Dev系统..."
                    
                    # 恢复数据库
                    if [ -f "$bak_pathg/gougudev.sql.gz" ]; then
                        # 先删除现有数据库
                        echo "删除现有数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $DEV_DB_NAME;"    
                        # 重新创建空数据库
                        echo "重新创建空数据库..."
                        mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "CREATE DATABASE $DEV_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 
                        echo "恢复Dev数据库..."
                        zcat "$bak_pathg/gougudev.sql.gz" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME"
                    fi
                    
                    # 恢复文件系统
                    if [ -f "$bak_pathg/dev.tar.gz" ]; then
                        echo "恢复Dev文件系统..."
                        rm -rf "$DEV_ROOT"/*
                        tar -xzf "$bak_pathg/dev.tar.gz" -C "$(dirname "$DEV_ROOT")"
                    fi
                    
                    echo "Dev系统回滚完成，已恢复到升级前状态"
                    echo " "
                    echo "1、请处理上面提示问题后重新升级。"
                    echo "2、之前已经正常升级过的（务必正常升级过的）请执行下面命令修复后，继续执行升级程序,其中gougu为容器名称，若为其他名称请自行修改， "
                    echo "docker安装的执行：docker exec -it gougu sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/dev_upgrade_status.log"
                    echo "纯系统安装的执行：sed -i 's/|FAILED|/|SUCCESS|/g' /opt/updatemysqllog/dev_upgrade_status.log"
                    echo " "
                    exit 1
                fi
            else
                echo "跳过已升级: $file_name (版本 $file_version <= 当前版本 $CURRENT_VERSION)"
            fi
        else
            echo "警告：升级文件 $(basename "$UPGRADE_FILE") 不存在，跳过！"
        fi
    done <<< "$UPGRADE_FILES"

    # 删除下载的数据库文件
    sleep 2
    rm -rf $updatesql
    echo "#####################################"

    # 设置目录权限
    echo "设置目录权限..."
    chmod -R 777 "$DEV_ROOT"/{app,public,config,runtime}
    if [ $? -eq 0 ]; then
        echo "目录权限设置成功！"
    else
        echo "错误：目录权限设置失败！"
        exit 1
    fi

    # 清理临时目录
    echo "清理临时目录..."
    rm -rf "$DEV_ROOT"/app/install
    rm -rf /data/dev
    if [ $? -eq 0 ]; then
        echo "临时目录清理成功！"
    else
        echo "错误：临时目录清理失败！"
        exit 1
    fi

    echo "Dev 升级完成！"

    # 更新完成后，备份 Dev 应用文件和数据库
    echo "更新完成后，备份 Dev 应用文件和数据库..."
    tar -czf "$bak_pathu/dev.tar.gz" -C "$(dirname "$DEV_ROOT")" "$(basename "$DEV_ROOT")"
    if [ $? -eq 0 ]; then
        echo "Dev 应用文件备份成功！"
    else
        echo "错误：Dev 应用文件备份失败！"
        exit 1
    fi

    if [ -n "$DEV_DB_NAME" ]; then
        echo "备份 Dev 数据库..."
        mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME" | gzip > "$bak_pathu/gougudev.sql.gz"
        if [ $? -eq 0 ]; then
            echo "Dev 数据库备份成功！"
        else
            echo "错误：Dev 数据库备份失败！"
            exit 1
        fi
    fi
fi
# end4
#





#start5
echo "#####################################"
echo "等待马上完成...."

# 定义updatefiles备份目录
backup_dir="$bak_pathu/updateallfiles_$(date +\%Y\%m\%d\%H\%M)"

# 创建备份目录
mkdir -p "$backup_dir" || { echo "无法创建备份目录: $backup_dir"; exit 1; }

# 复制当前目录下的文件（不包括子目录）
find "$bak_pathu" -maxdepth 1 -type f -exec cp -f {} "$backup_dir" \; || { echo "复制文件到 $backup_dir 失败"; exit 1; }

echo "备份updatefiles完成"

# 定义备份目录upgradefiles
backup_dirg="$bak_pathg/upgradefiles_$(date +\%Y\%m\%d\%H\%M)"

# 创建备份目录
mkdir -p "$backup_dirg" || { echo "无法创建备份目录: $backup_dirg"; exit 1; }

# 复制当前目录下的文件（不包括子目录）
find "$bak_pathg" -maxdepth 1 -type f -exec cp -f {} "$backup_dirg" \; || { echo "复制文件到 $backup_dirg 失败"; exit 1; }

echo "备份目录upgradefiles完成"

rm -rf /data/backup/backupmysql
echo "#####################################"


# 写入备份脚本和设置定时任务前增加用户确认提示

# 第一次写入：需要扩展的部分（MySQL配置）
function write_backup_script() {
    echo "#####################################"
    echo "即将配置备份脚本"
    echo "注意：此操作将覆盖 /opt/gougu/backupallfiles.sh"
    echo "您有30秒时间确认，默认不执行 (y/N)?"
    read -t 30 -p "请确认: " confirm || {
        echo -e "\n超时未确认，跳过配置备份脚本"
        return 1
    }

    [[ $confirm =~ ^[yY]$ ]] || {
        echo "用户取消，跳过配置备份脚本"
        return 1
    }

mkdir -p "/opt/gougu/"
cat <<EOF | tee /opt/gougu/backupallfiles.sh >/dev/null
#!/bin/bash

# MySQL连接配置（生成时已扩展为实际值）
MYSQL_USER='$MYSQL_USER'
MYSQL_PASSWORD='$MYSQL_PASSWORD'
MYSQL_HOST='$MYSQL_HOST'
MYSQL_PORT='$MYSQL_PORT'

OA_ROOT='$OA_ROOT'
BLOG_ROOT='$BLOG_ROOT'
DEV_ROOT='$DEV_ROOT'

EOF

    # 第二次写入：不需要扩展的部分（脚本主体）
    cat <<'EOL' | tee -a /opt/gougu/backupallfiles.sh >/dev/null
bak_pathg=/data/backup/upgradefiles
bak_pathu=/data/backup/updatefiles
bak_pathb=/data/backup/backupallfiles
bak_patho=/data/backup/other

mkdir -p  $bak_pathg $bak_pathu $bak_pathb $bak_patho
find $bak_pathb -maxdepth 1 -type f -exec rm -f {} \;

# 检测已安装的系统
HAS_OA=false
HAS_BLOG=false
HAS_DEV=false

# 检查OA是否安装
if [ -d "$OA_ROOT/app" ]; then
    HAS_OA=true
    OA_DB_NAME="gouguoa"
    OA_ROOT="$OA_ROOT"
    OA_FILE_COUNT=$(find "$OA_ROOT" -type f | wc -l)
fi

# 检查Blog是否安装
if [ -d "$BLOG_ROOT/app" ]; then
    HAS_BLOG=true
    BLOG_DB_NAME="gougublog"
    BLOG_ROOT="$BLOG_ROOT"
    BLOG_FILE_COUNT=$(find "$BLOG_ROOT" -type f | wc -l)
fi

# 检查Dev是否安装
if [ -d "$DEV_ROOT/app" ]; then
    HAS_DEV=true
    DEV_DB_NAME="gougudev"
    DEV_ROOT="$DEV_ROOT"
    DEV_FILE_COUNT=$(find "$DEV_ROOT" -type f | wc -l)
fi

if ! $HAS_OA && ! $HAS_BLOG && ! $HAS_DEV; then
    echo "错误：未检测到任何已安装的系统（OA/Blog/Dev）！"
    exit 1
fi

if ! mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1" >/dev/null 2>&1; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误：无法连接到MySQL服务器，请检查服务状态或配置！" | tee -a "$bak_pathb/errorlog.txt" >&2
    exit 1
fi

if $HAS_OA; then
    echo "备份OA数据库..."
    mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME" | gzip > "$bak_pathb/${OA_DB_NAME}.sql.gz"
fi

if $HAS_BLOG; then
    echo "备份Blog数据库..."
    mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME" | gzip > "$bak_pathb/${BLOG_DB_NAME}.sql.gz"
fi

if $HAS_DEV; then
    echo "备份Dev数据库..."
    mysqldump -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME" | gzip > "$bak_pathb/${DEV_DB_NAME}.sql.gz"
fi

if $HAS_OA; then
    echo "备份OA文件..."
    tar -czf "$bak_pathb/office.tar.gz" -C "$(dirname "$OA_ROOT")" "$(basename "$OA_ROOT")"
    TEMP_DIR=$(mktemp -d)
    tar -xzf "$bak_pathb/office.tar.gz" -C "$TEMP_DIR"
    OA_BACKUP_COUNT=$(find "$TEMP_DIR" -type f | wc -l)
    rm -rf "$TEMP_DIR"
    
    [ "$OA_FILE_COUNT" -ne "$OA_BACKUP_COUNT" ] && {
        echo "[错误] OA文件数量不匹配！原文件: $OA_FILE_COUNT, 备份文件: $OA_BACKUP_COUNT"
        exit 1
    }
    echo "[OK] OA文件数量验证通过: $OA_FILE_COUNT 个文件"
fi

if $HAS_BLOG; then
    echo "备份Blog文件..."
    tar -czf "$bak_pathb/blog.tar.gz" -C "$(dirname "$BLOG_ROOT")" "$(basename "$BLOG_ROOT")"
    TEMP_DIR=$(mktemp -d)
    tar -xzf "$bak_pathb/blog.tar.gz" -C "$TEMP_DIR"
    BLOG_BACKUP_COUNT=$(find "$TEMP_DIR" -type f | wc -l)
    rm -rf "$TEMP_DIR"
    
    [ "$BLOG_FILE_COUNT" -ne "$BLOG_BACKUP_COUNT" ] && {
        echo "[错误] Blog文件数量不匹配！原文件: $BLOG_FILE_COUNT, 备份文件: $BLOG_BACKUP_COUNT"
        exit 1
    }
    echo "[OK] Blog文件数量验证通过: $BLOG_FILE_COUNT 个文件"
fi

if $HAS_DEV; then
    echo "备份Dev文件..."
    tar -czf "$bak_pathb/dev.tar.gz" -C "$(dirname "$DEV_ROOT")" "$(basename "$DEV_ROOT")"
    TEMP_DIR=$(mktemp -d)
    tar -xzf "$bak_pathb/dev.tar.gz" -C "$TEMP_DIR"
    DEV_BACKUP_COUNT=$(find "$TEMP_DIR" -type f | wc -l)
    rm -rf "$TEMP_DIR"
    
    [ "$DEV_FILE_COUNT" -ne "$DEV_BACKUP_COUNT" ] && {
        echo "[错误] Dev文件数量不匹配！原文件: $DEV_FILE_COUNT, 备份文件: $DEV_BACKUP_COUNT"
        exit 1
    }
    echo "[OK] Dev文件数量验证通过: $DEV_FILE_COUNT 个文件"
fi

validate_mysql_backup() {
    local file=$1
    if ! gzip -t "$file"; then
        echo "[错误] MySQL备份文件损坏: $file"
        exit 1
    fi
    echo "[OK] 数据库备份验证通过: $file"
}

validate_file_backup() {
    local file=$1
    if ! tar -tzf "$file" >/dev/null 2>&1; then
        echo "[错误] 文件备份损坏: $file"
        exit 1
    fi
    echo "[OK] 文件备份验证通过: $file"
}

if $HAS_OA; then
    validate_mysql_backup "$bak_pathb/${OA_DB_NAME}.sql.gz"
    validate_file_backup "$bak_pathb/office.tar.gz"
fi

if $HAS_BLOG; then
    validate_mysql_backup "$bak_pathb/${BLOG_DB_NAME}.sql.gz"
    validate_file_backup "$bak_pathb/blog.tar.gz"
fi

if $HAS_DEV; then
    validate_mysql_backup "$bak_pathb/${DEV_DB_NAME}.sql.gz"
    validate_file_backup "$bak_pathb/dev.tar.gz"
fi

echo "复制备份文件......"
backup_dir="$bak_pathb/backupallfiles_$(date +\%Y\%m\%d\%H\%M)"
mkdir -p "$backup_dir" || { echo "无法创建备份目录: $backup_dir"; exit 1; }
find "$bak_pathb" -maxdepth 1 -type f -exec cp -f {} "$backup_dir" \; || { echo "复制文件到 $backup_dir 失败"; exit 1; }

echo "Only retain data from the past 3 days，只保留最近3天的文件" > $bak_pathb/read.txt
echo "Only retain data from the past 3 days，只保留最近3天的文件" > $bak_pathu/read.txt
echo "Only retain data from the past 3 days，只保留最近3天的文件" > $bak_pathg/read.txt
echo "Only retain data from the past 3 days，只保留最近3天的文件" > $bak_patho/read.txt

find $bak_pathb -mindepth 1 -maxdepth 1 -type d -mtime +2 -exec rm -rf {} \;
find $bak_pathb -mindepth 1 -maxdepth 1 -type f -mtime +2 -exec rm -rf {} \;
find $bak_pathb -mindepth 1 -maxdepth 1 -type d -ctime +2 -exec rm -rf {} \;
echo "删除backupallfiles超过3天的文件完成"

find $bak_pathu -mindepth 1 -maxdepth 1 -type d -mtime +2 -exec rm -rf {} \;
find $bak_pathu -mindepth 1 -maxdepth 1 -type f -mtime +2 -exec rm -rf {} \;
find $bak_pathu -mindepth 1 -maxdepth 1 -type d -ctime +2 -exec rm -rf {} \;
echo "删除updatefiles超过3天的文件完成"

find $bak_pathg -mindepth 1 -maxdepth 1 -type d -mtime +2 -exec rm -rf {} \;
find $bak_pathg -mindepth 1 -maxdepth 1 -type f -mtime +2 -exec rm -rf {} \;
find $bak_pathg -mindepth 1 -maxdepth 1 -type d -ctime +2 -exec rm -rf {} \;
echo "删除upgradefiles超过3天的文件完成"

find $bak_patho -mindepth 1 -maxdepth 1 -type d -mtime +2 -exec rm -rf {} \;
find $bak_patho -mindepth 1 -maxdepth 1 -type f -mtime +2 -exec rm -rf {} \;
find $bak_patho -mindepth 1 -maxdepth 1 -type d -ctime +2 -exec rm -rf {} \;
echo "删除other超过3天的文件完成"
EOL

    chmod +x /opt/gougu/backupallfiles.sh
    echo "备份脚本配置完成"
}

# 设置定时任务
function setup_cron_job() {
    echo "#####################################"
    echo "即将设置定时任务（每天19:30执行备份）"
    echo "您有30秒时间确认，默认不执行 (y/N)?"
    read -t 30 -p "请确认: " confirm || {
        echo -e "\n超时未确认，跳过设置定时任务"
        return 1
    }

    [[ $confirm =~ ^[yY]$ ]] || {
        echo "用户取消，跳过设置定时任务"
        return 1
    }

    CRON_JOB_1="30 19 * * * root /bin/sh /opt/gougu/backupallfiles.sh"

    if ! grep -Fxq "$CRON_JOB_1" /etc/crontab; then
        echo "$CRON_JOB_1" >> /etc/crontab || { echo "无法写入 /etc/crontab"; return 1; }
        echo "定时任务已添加"
    else
        echo "定时任务已存在，无需重复添加"
    fi
}

# 主执行流程
write_backup_script
setup_cron_job

echo "#####################################"
echo "升级完成"
# end5











# start6

#!/bin/bash

# 定义备份目录路径
bak_pathg=/data/backup/upgradefiles   # 升级前备份
bak_pathu=/data/backup/updatefiles    # 升级后备份
bak_pathb=/data/backup/backupallfiles # 常规备份

# 创建备份目录（如果不存在）
mkdir -p $bak_pathg $bak_pathu $bak_pathb

# 显示菜单函数
show_menu() {
    clear
    echo "===================================="
    echo "         OA数据还原工具 v1.0          "
    echo "===================================="
    echo "1. 还原升级前的数据 (目录: $bak_pathg)"
    echo "2. 还原升级后的数据 (目录: $bak_pathu)"
    echo "3. 还原上次备份的数据 (目录: $bak_pathb)"
    echo "0. 退出"
    echo "===================================="
    echo ""
    read -p "请输入您的选择 [0-3]: " choice
}

# 获取数据库连接信息函数
get_db_info() {
    # 获取用户输入，带有默认值
# 提示用户输入 MySQL 连接信息
while true; do
    read -p "请输入 MySQL 用户名一般用root: " MYSQL_USER
    read -s -p "请输入 MySQL 密码一般用root密码: " MYSQL_PASSWORD
    echo
    read -p "请输入 MySQL 主机地址 (默认: 127.0.0.1)回车: " MYSQL_HOST
    MYSQL_HOST=${MYSQL_HOST:-127.0.0.1}
    read -p "请输入 MySQL 端口 (默认: 3306)回车: " MYSQL_PORT
    MYSQL_PORT=${MYSQL_PORT:-3306}

    # 测试 MySQL 连接
    if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1;" > /dev/null 2>&1; then
        echo "MySQL 连接成功！"
        break
    else
        echo "错误：无法连接到 MySQL 服务器，请检查服务状态或配置！"
        read -p "是否重新输入 MySQL 连接信息？(y/n): " RETRY
        if [[ "$RETRY" != "y" && "$RETRY" != "Y" ]]; then
            echo "退出脚本。"
            exit 1
        fi
    fi
done
}

# 获取OA目录信息函数
get_oa_info() {
    # 获取目标目录输入并严格验证app子目录
    while true; do
        read -p "请输入OA还原目标目录路径（默认为/www/wwwroot/office,若是其它路径请从新输入）: " OA_ROOT
        OA_ROOT=${OA_ROOT:-/www/wwwroot/office}
        
        # 检查目录是否存在app子目录
        if [ -d "$OA_ROOT/app" ]; then
            echo "检测到有效的OA目录结构（存在子目录）"
            break
        else
            echo "错误：目录 $OA_ROOT 下没有找到子目录，请确认OA安装目录后重新输入（按Ctrl+C退出）"
        fi
    done

    # 获取数据库名输入并检查是否存在
    while true; do
        read -p "请输入OA数据库名（默认为gouguoa,若是其它名称请从新输入）: " OA_DB_NAME
        OA_DB_NAME=${OA_DB_NAME:-gouguoa}
        
        # 检查数据库是否存在
        DB_EXISTS=$(mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES LIKE '$OA_DB_NAME';" 2>/dev/null | grep "$OA_DB_NAME")
        
        if [ -n "$DB_EXISTS" ]; then
            echo "数据库 $OA_DB_NAME 存在，继续执行..."
            break
        else
            echo "错误：数据库 $OA_DB_NAME 不存在，请重新输入正确的数据库名！"
                        # 显示可用的数据库列表供用户参考
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
        fi
    done
}

# 检查备份文件是否存在
check_backup_files() {
    local backup_path=$1
    local tar_file="office.tar.gz"
    local sql_file="gouguoa.sql.gz"  # 修改为固定文件名
    
    if [ ! -f "$backup_path/$tar_file" ] || [ ! -f "$backup_path/$sql_file" ]; then
        echo "错误：备份文件不完整，无法执行还原操作"
        echo "需要同时存在以下两个文件:"
        echo "1. $backup_path/$tar_file"
        echo "2. $backup_path/$sql_file"
        return 1
    fi
    return 0
}

# 还原数据函数
restore_data() {
    local backup_path=$1
    
    # 固定文件名
    local tar_file="office.tar.gz"
    local sql_file="gouguoa.sql.gz"  # 修改为固定文件名

    # 检查备份文件是否存在
    if ! check_backup_files "$backup_path"; then
        read -p "按任意键返回主菜单..." -n1 -s
        return
    fi

    # 删除旧目录并解压文件
    echo "正在删除旧目录 $OA_ROOT..."
    rm -rf "$OA_ROOT"
    mkdir -p "$OA_ROOT"

    echo "正在从 $backup_path 解压 $tar_file 到 $OA_ROOT..."
    tar -xzf "$backup_path/$tar_file" -C "$OA_ROOT" --strip-components=1
    chmod -R 777 "$OA_ROOT"/{app,public,config,runtime}
    echo "解压成功！"
    
    # 解压后严格验证app目录是否存在
    if [ ! -d "$OA_ROOT/app" ]; then
        echo "错误：解压后 $OA_ROOT 下没有找到子目录，可能压缩包内容不正确"
        echo "请检查备份文件 $backup_path/$tar_file 是否完整有效"
        exit 1
    fi

    # 清空目标数据库并还原
    echo "正在清空数据库 $OA_DB_NAME..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $OA_DB_NAME; CREATE DATABASE $OA_DB_NAME;"
    echo "数据库清空成功！"

    # 还原数据库
    echo "正在还原数据库 $OA_DB_NAME..."
    gunzip -c "$backup_path/$sql_file" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$OA_DB_NAME"
    echo "数据库还原成功！"

    echo "数据还原操作完成！"
    read -p "按任意键继续..." -n1 -s
}

# 主菜单循环
while true; do
    show_menu
    case $choice in
        1)
            echo "您选择了: 还原升级前的数据"
            get_db_info
            get_oa_info
            restore_data $bak_pathg
            ;;
        2)
            echo "您选择了: 还原升级后的数据"
            get_db_info
            get_oa_info
            restore_data $bak_pathu
            ;;
        3)
            echo "您选择了: 还原上次备份的数据"
            get_db_info
            get_oa_info
            restore_data $bak_pathb
            ;;
        0)
            echo "退出程序..."
            exit 0
            ;;
        *)
            echo "错误：无效的选择，请重新输入！"
            sleep 2
            ;;
    esac
done
rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}

# end6










# start7
#!/bin/bash

# 定义备份目录路径
bak_pathg=/data/backup/upgradefiles   # 升级前备份
bak_pathu=/data/backup/updatefiles    # 升级后备份
bak_pathb=/data/backup/backupallfiles # 常规备份

# 创建备份目录（如果不存在）
mkdir -p $bak_pathg $bak_pathu $bak_pathb

# 显示菜单函数
show_menu() {
    clear
    echo "===================================="
    echo "         BLOG数据还原工具 v1.0          "
    echo "===================================="
    echo "1. 还原升级前的数据 (目录: $bak_pathg)"
    echo "2. 还原升级后的数据 (目录: $bak_pathu)"
    echo "3. 还原上次备份的数据 (目录: $bak_pathb)"
    echo "0. 退出"
    echo "===================================="
    echo ""
    read -p "请输入您的选择 [0-3]: " choice
}

# 获取数据库连接信息函数
get_db_info() {
    # 获取用户输入，带有默认值
# 提示用户输入 MySQL 连接信息
while true; do
    read -p "请输入 MySQL 用户名一般用root: " MYSQL_USER
    read -s -p "请输入 MySQL 密码一般用root密码: " MYSQL_PASSWORD
    echo
    read -p "请输入 MySQL 主机地址 (默认: 127.0.0.1)回车: " MYSQL_HOST
    MYSQL_HOST=${MYSQL_HOST:-127.0.0.1}
    read -p "请输入 MySQL 端口 (默认: 3306)回车: " MYSQL_PORT
    MYSQL_PORT=${MYSQL_PORT:-3306}

    # 测试 MySQL 连接
    if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1;" > /dev/null 2>&1; then
        echo "MySQL 连接成功！"
        break
    else
        echo "错误：无法连接到 MySQL 服务器，请检查服务状态或配置！"
        read -p "是否重新输入 MySQL 连接信息？(y/n): " RETRY
        if [[ "$RETRY" != "y" && "$RETRY" != "Y" ]]; then
            echo "退出脚本。"
            exit 1
        fi
    fi
done
}

# 获取BLOG目录信息函数
get_blog_info() {
    # 获取目标目录输入并严格验证app子目录
    while true; do
        read -p "请输入BLOG还原目标目录路径（默认为/www/wwwroot/blog,若是其它路径请从新输入）: " BLOG_ROOT
        BLOG_ROOT=${BLOG_ROOT:-/www/wwwroot/blog}
        
        # 检查目录是否存在app子目录
        if [ -d "$BLOG_ROOT/app" ]; then
            echo "检测到有效的BLOG目录结构（存在子目录）"
            break
        else
            echo "错误：目录 $BLOG_ROOT 下没有找到子目录，请确认BLOG安装目录后重新输入（按Ctrl+C退出）"
        fi
    done

    # 获取数据库名输入并验证是否存在
    while true; do
        read -p "请输入BLOG数据库名（默认为gougublog,若是其它名称请从新输入）: " BLOG_DB_NAME
        BLOG_DB_NAME=${BLOG_DB_NAME:-gougublog}
        
        # 检查数据库是否存在
        echo "正在验证数据库 $BLOG_DB_NAME 是否存在..."
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $BLOG_DB_NAME" 2>/dev/null; then
            echo "数据库 $BLOG_DB_NAME 存在，验证通过"
            break
        else
            echo "错误：数据库 $BLOG_DB_NAME 不存在或无法连接，请检查后重新输入（按Ctrl+C退出）"
            # 显示可用的数据库列表供用户参考
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
        fi
    done
}

# 检查备份文件是否存在
check_backup_files() {
    local backup_path=$1
    local tar_file="blog.tar.gz"
    local sql_file="gougublog.sql.gz"
    
    if [ ! -f "$backup_path/$tar_file" ] || [ ! -f "$backup_path/$sql_file" ]; then
        echo "错误：备份文件不完整，无法执行还原操作"
        echo "需要同时存在以下两个文件:"
        echo "1. $backup_path/$tar_file"
        echo "2. $backup_path/$sql_file"
        return 1
    fi
    return 0
}

# 还原数据函数
restore_data() {
    local backup_path=$1
    
    # 固定文件名
    local tar_file="blog.tar.gz"
    local sql_file="gougublog.sql.gz"

    # 检查备份文件是否存在
    if ! check_backup_files "$backup_path"; then
        read -p "按任意键返回主菜单..." -n1 -s
        return
    fi

    # 删除旧目录并解压文件
    echo "正在删除旧目录 $BLOG_ROOT..."
    rm -rf "$BLOG_ROOT"
    mkdir -p "$BLOG_ROOT"

    echo "正在从 $backup_path 解压 $tar_file 到 $BLOG_ROOT..."
    tar -xzf "$backup_path/$tar_file" -C "$BLOG_ROOT" --strip-components=1
    chmod -R 777 "$BLOG_ROOT"/{app,public,config,runtime}
    echo "解压成功！"
    
    # 解压后严格验证app目录是否存在
    if [ ! -d "$BLOG_ROOT/app" ]; then
        echo "错误：解压后 $BLOG_ROOT 下没有找到子目录，可能压缩包内容不正确"
        echo "请检查备份文件 $backup_path/$tar_file 是否完整有效"
        exit 1
    fi

    # 清空目标数据库并还原
    echo "正在清空数据库 $BLOG_DB_NAME..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $BLOG_DB_NAME; CREATE DATABASE $BLOG_DB_NAME;"
    echo "数据库清空成功！"

    # 还原数据库
    echo "正在还原数据库 $BLOG_DB_NAME..."
    gunzip -c "$backup_path/$sql_file" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$BLOG_DB_NAME"
    echo "数据库还原成功！"

    echo "数据还原操作完成！"
    read -p "按任意键继续..." -n1 -s
}

# 主菜单循环
while true; do
    show_menu
    case $choice in
        1)
            echo "您选择了: 还原升级前的数据"
            get_db_info
            get_blog_info
            restore_data $bak_pathg
            ;;
        2)
            echo "您选择了: 还原升级后的数据"
            get_db_info
            get_blog_info
            restore_data $bak_pathu
            ;;
        3)
            echo "您选择了: 还原上次备份的数据"
            get_db_info
            get_blog_info
            restore_data $bak_pathb
            ;;
        0)
            echo "退出程序..."
            exit 0
            ;;
        *)
            echo "错误：无效的选择，请重新输入！"
            sleep 2
            ;;
    esac
done
rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}

# end7






# start8

#!/bin/bash

# 定义备份目录路径
bak_pathg=/data/backup/upgradefiles   # 升级前备份
bak_pathu=/data/backup/updatefiles    # 升级后备份
bak_pathb=/data/backup/backupallfiles # 常规备份

# 创建备份目录（如果不存在）
mkdir -p $bak_pathg $bak_pathu $bak_pathb

# 显示菜单函数
show_menu() {
    clear
    echo "===================================="
    echo "         DEV数据还原工具 v1.0          "
    echo "===================================="
    echo "1. 还原升级前的数据 (目录: $bak_pathg)"
    echo "2. 还原升级后的数据 (目录: $bak_pathu)"
    echo "3. 还原上次备份的数据 (目录: $bak_pathb)"
    echo "0. 退出"
    echo "===================================="
    echo ""
    read -p "请输入您的选择 [0-3]: " choice
}

# 获取数据库连接信息函数
get_db_info() {
    # 获取用户输入，带有默认值
# 提示用户输入 MySQL 连接信息
while true; do
    read -p "请输入 MySQL 用户名一般用root: " MYSQL_USER
    read -s -p "请输入 MySQL 密码一般用root密码: " MYSQL_PASSWORD
    echo
    read -p "请输入 MySQL 主机地址 (默认: 127.0.0.1)回车: " MYSQL_HOST
    MYSQL_HOST=${MYSQL_HOST:-127.0.0.1}
    read -p "请输入 MySQL 端口 (默认: 3306)回车: " MYSQL_PORT
    MYSQL_PORT=${MYSQL_PORT:-3306}

    # 测试 MySQL 连接
    if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1;" > /dev/null 2>&1; then
        echo "MySQL 连接成功！"
        break
    else
        echo "错误：无法连接到 MySQL 服务器，请检查服务状态或配置！"
        read -p "是否重新输入 MySQL 连接信息？(y/n): " RETRY
        if [[ "$RETRY" != "y" && "$RETRY" != "Y" ]]; then
            echo "退出脚本。"
            exit 1
        fi
    fi
done
}

# 获取数据库名并验证是否存在
get_db_name() {
    while true; do
        read -p "请输入DEV数据库名（默认为gougudev，若是其它名称请重新输入）: " DEV_DB_NAME
        DEV_DB_NAME=${DEV_DB_NAME:-gougudev}
        
        # 检查数据库是否存在
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $DEV_DB_NAME" 2>/dev/null; then
            echo "验证成功：数据库 $DEV_DB_NAME 存在。"
            break
        else
            echo "错误：数据库 $DEV_DB_NAME 不存在！"
            # 显示可用的数据库列表供用户参考
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
            echo ""
        fi
    done
}

# 获取DEV目录信息函数
get_dev_info() {
    # 获取目标目录输入并严格验证app子目录
    while true; do
        read -p "请输入DEV还原目标目录路径（默认为/www/wwwroot/dev,若是其它路径请重新输入）: " DEV_ROOT
        DEV_ROOT=${DEV_ROOT:-/www/wwwroot/dev}
        
        # 检查目录是否存在app子目录
        if [ -d "$DEV_ROOT/app" ]; then
            echo "检测到有效的DEV目录结构（存在子目录）"
            break
        else
            echo "错误：目录 $DEV_ROOT 下没有找到子目录，请确认DEV安装目录后重新输入（按Ctrl+C退出）"
        fi
    done

    # 调用数据库名获取函数
    get_db_name
}

# 检查备份文件是否存在
check_backup_files() {
    local backup_path=$1
    local tar_file="dev.tar.gz"
    local sql_file="gougudev.sql.gz"
    
    if [ ! -f "$backup_path/$tar_file" ] || [ ! -f "$backup_path/$sql_file" ]; then
        echo "错误：备份文件不完整，无法执行还原操作"
        echo "需要同时存在以下两个文件:"
        echo "1. $backup_path/$tar_file"
        echo "2. $backup_path/$sql_file"
        return 1
    fi
    return 0
}

# 还原数据函数
restore_data() {
    local backup_path=$1
    
    # 固定文件名
    local tar_file="dev.tar.gz"
    local sql_file="gougudev.sql.gz"

    # 检查备份文件是否存在
    if ! check_backup_files "$backup_path"; then
        read -p "按任意键返回主菜单..." -n1 -s
        return
    fi

    # 删除旧目录并解压文件
    echo "正在删除旧目录 $DEV_ROOT..."
    rm -rf "$DEV_ROOT"
    mkdir -p "$DEV_ROOT"

    echo "正在从 $backup_path 解压 $tar_file 到 $DEV_ROOT..."
    tar -xzf "$backup_path/$tar_file" -C "$DEV_ROOT" --strip-components=1
    chmod -R 777 "$DEV_ROOT"/{app,public,config,runtime}
    echo "解压成功！"
    
    # 解压后严格验证app目录是否存在
    if [ ! -d "$DEV_ROOT/app" ]; then
        echo "错误：解压后 $DEV_ROOT 下没有找到子目录，可能压缩包内容不正确"
        echo "请检查备份文件 $backup_path/$tar_file 是否完整有效"
        exit 1
    fi

    # 清空目标数据库并还原
    echo "正在清空数据库 $DEV_DB_NAME..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $DEV_DB_NAME; CREATE DATABASE $DEV_DB_NAME;"
    echo "数据库清空成功！"

    # 还原数据库
    echo "正在还原数据库 $DEV_DB_NAME..."
    gunzip -c "$backup_path/$sql_file" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$DEV_DB_NAME"
    echo "数据库还原成功！"

    echo "数据还原操作完成！"
    read -p "按任意键继续..." -n1 -s
}

# 主菜单循环
while true; do
    show_menu
    case $choice in
        1)
            echo "您选择了: 还原升级前的数据"
            get_db_info
            get_dev_info
            restore_data $bak_pathg
            ;;
        2)
            echo "您选择了: 还原升级后的数据"
            get_db_info
            get_dev_info
            restore_data $bak_pathu
            ;;
        3)
            echo "您选择了: 还原上次备份的数据"
            get_db_info
            get_dev_info
            restore_data $bak_pathb
            ;;
        0)
            echo "退出程序..."
            exit 0
            ;;
        *)
            echo "错误：无效的选择，请重新输入！"
            sleep 2
            ;;
    esac
done
rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
# end8


# start9
#
#!/bin/bash

# 定义备份目录路径
bak_patho=/data/backup/other   # 仅使用other目录

# 创建备份目录（如果不存在）
mkdir -p $bak_patho

# 显示菜单函数
show_menu() {
    clear
    echo "===================================="
    echo "        数据还原工具 v1.0          "
    echo "===================================="
    echo "请先把下面数据上传到$bak_patho目录内"
    echo "===================================="
    echo "
    "office.tar.gz"，"gouguoa.sql.gz"；
    "blog.tar.gz"，"gougublog.sql.gz"；
    "dev.tar.gz"，"gougudev.sql.gz""
    echo "===================================="
    echo "1. 还原OA系统数据"
    echo "2. 还原BLOG系统数据"
    echo "3. 还原DEV系统数据"
    echo "4. 还原全部数据(OA+BLOG+DEV)"
    echo "0. 退出"
    echo "===================================="
    echo ""
    read -p "请输入您的选择 [0-4]: " choice
}

# 获取数据库连接信息函数
get_db_info() {
    while true; do
        read -p "请输入 MySQL 用户名(默认root): " MYSQL_USER
        MYSQL_USER=${MYSQL_USER:-root}
        read -s -p "请输入 MySQL 密码: " MYSQL_PASSWORD
        echo
        read -p "请输入 MySQL 主机地址 (默认: 127.0.0.1): " MYSQL_HOST
        MYSQL_HOST=${MYSQL_HOST:-127.0.0.1}
        read -p "请输入 MySQL 端口 (默认: 3306): " MYSQL_PORT
        MYSQL_PORT=${MYSQL_PORT:-3306}

        # 测试 MySQL 连接
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SELECT 1;" > /dev/null 2>&1; then
            echo "MySQL 连接成功！"
            break
        else
            echo "错误：无法连接到 MySQL 服务器，请检查服务状态或配置！"
            read -p "是否重新输入 MySQL 连接信息？(y/n): " RETRY
            if [[ "$RETRY" != "y" && "$RETRY" != "Y" ]]; then
                echo "退出脚本。"
                exit 1
            fi
        fi
    done
}

# 获取应用信息函数
get_app_info() {
    local app_type=$1
    
    case $app_type in
        oa)
            APP_NAME="OA"
            DEFAULT_ROOT="/www/wwwroot/office"
            OA_DB_NAME="gouguoa"
            TAR_FILE="office.tar.gz"
            SQL_FILE="gouguoa.sql.gz"
            ;;
        blog)
            APP_NAME="BLOG"
            DEFAULT_ROOT="/www/wwwroot/blog"
            BLOG_DB_NAME="gougublog"
            TAR_FILE="blog.tar.gz"
            SQL_FILE="gougublog.sql.gz"
            ;;
        dev)
            APP_NAME="DEV"
            DEFAULT_ROOT="/www/wwwroot/dev"
            DEV_DB_NAME="gougudev"
            TAR_FILE="dev.tar.gz"
            SQL_FILE="gougudev.sql.gz"
            ;;
    esac

    # 获取目标目录
    while true; do
        read -p "请输入${APP_NAME}还原目标目录路径（默认: $DEFAULT_ROOT）: " APP_ROOT
        APP_ROOT=${APP_ROOT:-$DEFAULT_ROOT}
        
        if [ -d "$APP_ROOT/app" ]; then
            echo "检测到有效的${APP_NAME}目录结构"
            break
        else
            echo "错误：目录 $APP_ROOT 下没有找到子目录，请确认后重新输入"
        fi
    done

    # 获取数据库名
    while true; do
        case $app_type in
            oa)
                read -p "请输入${APP_NAME}数据库名（默认: $OA_DB_NAME）: " DB_NAME
                DB_NAME=${DB_NAME:-$OA_DB_NAME}
                ;;
            blog)
                read -p "请输入${APP_NAME}数据库名（默认: $BLOG_DB_NAME）: " DB_NAME
                DB_NAME=${DB_NAME:-$BLOG_DB_NAME}
                ;;
            dev)
                read -p "请输入${APP_NAME}数据库名（默认: $DEV_DB_NAME）: " DB_NAME
                DB_NAME=${DB_NAME:-$DEV_DB_NAME}
                ;;
        esac
        
        if mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "USE $DB_NAME" 2>/dev/null; then
            echo "数据库 $DB_NAME 验证通过"
            break
        else
            echo "错误：数据库 $DB_NAME 不存在！"
            echo "可用的数据库列表："
            mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "SHOW DATABASES;" 2>/dev/null || echo "无法获取数据库列表"
        fi
    done
}

# 检查备份文件是否存在
check_backup_files() {
    local tar_file=$1
    local sql_file=$2
    
    if [ ! -f "$bak_patho/$tar_file" ] || [ ! -f "$bak_patho/$sql_file" ]; then
        echo "错误：备份文件不完整，无法执行还原操作"
        echo "需要同时存在以下两个文件:"
        echo "1. $bak_patho/$tar_file"
        echo "2. $bak_patho/$sql_file"
        return 1
    fi
    return 0
}

# 修改系统数据库配置文件
modify_config() {
    local app_root="$1"
    local db_name="$2"
    local db_user="$MYSQL_USER"
    local db_pass="$MYSQL_PASSWORD"
    local db_host="$MYSQL_HOST"
    local db_port="$MYSQL_PORT"
    
    local config_file="$app_root/config/database.php"
    
    # 检查配置文件是否存在
    if [ ! -f "$config_file" ]; then
        echo "警告：未找到数据库配置文件 $config_file，跳过配置修改"
        return 1
    fi
    
    echo "正在修改${APP_NAME}系统数据库配置文件..."
    
    # 备份原配置文件
    cp "$config_file" "${config_file}.bak"
    
    # 使用sed修改配置（保持原有格式）
    sed -i "s/'database'\s*=>\s*'[^']*'/'database'           =>  '$db_name'/" "$config_file"
    sed -i "s/'username'\s*=>\s*'[^']*'/'username'           =>  '$db_user'/" "$config_file"
    sed -i "s/'password'\s*=>\s*'[^']*'/'password'           =>  '$db_pass'/" "$config_file"
    sed -i "s/'hostname'\s*=>\s*'[^']*'/'hostname'           =>  '$db_host'/" "$config_file"
    sed -i "s/'hostport'\s*=>\s*'[^']*'/'hostport'           =>  '$db_port'/" "$config_file"
    
    echo "数据库配置文件修改完成！"
}

# 还原单个应用数据函数
restore_single_app() {
    local app_type=$1
    
    get_app_info "$app_type"
    local tar_file="$TAR_FILE"
    local sql_file="$SQL_FILE"
    local app_root="$APP_ROOT"
    local db_name="$DB_NAME"

    # 检查备份文件是否存在
    if ! check_backup_files "$tar_file" "$sql_file"; then
        read -p "按任意键返回主菜单..." -n1 -s
        return 1
    fi

    # 删除旧目录并解压文件
    echo "正在删除旧目录 $app_root..."
    rm -rf "$app_root"
    mkdir -p "$app_root"

    echo "正在从 $bak_patho 解压 $tar_file 到 $app_root..."
    tar -xzf "$bak_patho/$tar_file" -C "$app_root" --strip-components=1
    chmod -R 777 "$app_root"/{app,public,config,runtime}
    echo "解压成功！"
    
    # 验证app目录
    if [ ! -d "$app_root/app" ]; then
        echo "错误：解压后 $app_root 下没有找到子目录"
        exit 1
    fi

    # 清空目标数据库并还原
    echo "正在清空数据库 $db_name..."
    mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $db_name; CREATE DATABASE $db_name;"
    
    echo "正在还原数据库 $db_name..."
    gunzip -c "$bak_patho/$sql_file" | mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -P "$MYSQL_PORT" "$db_name"
    echo "数据库还原成功！"

    # 修改配置文件
    modify_config "$app_root" "$db_name"

    echo "${APP_NAME}数据还原操作完成！"
    echo ""
}

# 还原全部数据函数
restore_all() {
    echo "开始还原全部数据(OA+BLOG+DEV)..."
    echo ""
    
    # 获取数据库连接信息(只需一次)
    get_db_info
    
    # 还原OA
    echo "========== 开始还原OA系统 =========="
    restore_single_app "oa"
    
    # 还原BLOG
    echo "========== 开始还原BLOG系统 =========="
    restore_single_app "blog"
    
    # 还原DEV
    echo "========== 开始还原DEV系统 =========="
    restore_single_app "dev"
    
    echo "全部数据还原完成！"
    read -p "按任意键继续..." -n1 -s
}

# 主菜单循环
while true; do
    show_menu
    case $choice in
        1)
            echo "您选择了: 还原OA系统数据"
            get_db_info
            restore_single_app "oa"
            read -p "按任意键继续..." -n1 -s
            ;;
        2)
            echo "您选择了: 还原BLOG系统数据"
            get_db_info
            restore_single_app "blog"
            read -p "按任意键继续..." -n1 -s
            ;;
        3)
            echo "您选择了: 还原DEV系统数据"
            get_db_info
            restore_single_app "dev"
            read -p "按任意键继续..." -n1 -s
            ;;
        4)
            echo "您选择了: 还原全部数据"
            restore_all
            ;;
        0)
            echo "退出程序..."
            exit 0
            ;;
        *)
            echo "错误：无效的选择，请重新输入！"
            sleep 2
            ;;
    esac
done
rm -rf /opt/updatemysqllog/{oa_upgrade_status.log,blog_upgrade_status.log,dev_upgrade_status.log}
# end9